﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestWork_1
{
    class Tasks
    {
        public void Task1()
        {
            // 1) Пользователь вводит целое число из консоли. Увеличить число на 10 и вывести на экран.

            Console.WriteLine("Please enter the number:");
            int number;
            bool incorChoice = Int32.TryParse(Console.ReadLine(), out number);
            if (incorChoice)
            {
                number += 10;
                Console.WriteLine("Result - {0}", number);
            }
            else
            {
                Console.WriteLine("Incorrect entered number.");
            }
        }


        public void Task2()
        {
            //2) Найти сумму ряда чисел от 1 до n. n - целое положительное число вводиться пользователем в консоли. 
            //Если n - не удовлетворяет условию - вывести сообщение об ошибке.

            Console.WriteLine("Please enter the number:");
            int number;
            bool incorChoice = Int32.TryParse(Console.ReadLine(), out number);
            int summ = 0;
            if (incorChoice && number > 0)
            {
                for (int i = 1; i <= number; i++)
                {
                    summ += i;
                }
                Console.WriteLine("Summ is - {0}", summ);
            }
            else
            {
                Console.WriteLine("Incorrect entered number.");
            }
        }

        public void Task3()
        {
            //3) Пользователь из консоли вводит координаты x и y двух точек. 
            //   Найти расстояние по прямой между этими точками.
            List<bool> choice = new List<bool>();

            Console.WriteLine("Enter cordinate x for the first point:");
            double x1;
            choice.Add(Double.TryParse(Console.ReadLine(), out x1));
            //bool incorChoiceX1 = Double.TryParse(Console.ReadLine(), out x1);
            Console.WriteLine("Enter cordinate y for the first point:");
            double y1;
            choice.Add(Double.TryParse(Console.ReadLine(), out y1));
            //bool incorChoiceY1 = Double.TryParse(Console.ReadLine(), out y1);

            Console.WriteLine("Enter cordinate x for the second point:");
            double x2;
            choice.Add(Double.TryParse(Console.ReadLine(), out x2));
            //bool incorChoiceX2 = Double.TryParse(Console.ReadLine(), out x2);
            Console.WriteLine("Enter cordinate y for the first point:");
            double y2;
            choice.Add(Double.TryParse(Console.ReadLine(), out y2));
            //bool incorChoiceY2 = Double.TryParse(Console.ReadLine(), out y2);
            if (choice.Contains(false))
            {
                Console.WriteLine("Incorrect entered something.");
            }
            else
            {
                double xLength = x1 - x2;
                double yLength = y1 - y2;
                double lineLenth = Math.Sqrt((xLength * xLength) + (yLength * yLength));
                Console.WriteLine("The length of the line is - {0:#.##}", lineLenth);
            }
            
        }

        public void Task4()
        {
            //4) Пользователь из консоли вводит координаты x и y точки.
            //    Определить какой четверти принадлежит точка.
            //    Обработать результат когда точка имеет координаты 0.0
            List<bool> choice = new List<bool>();

            Console.WriteLine("Enter cordinate x for the point:");
            double x;
            choice.Add(Double.TryParse(Console.ReadLine(), out x));
            Console.WriteLine("Enter cordinate y for the point:");
            double y;
            choice.Add(Double.TryParse(Console.ReadLine(), out y));
            int quadrant = 0;
            if (choice.Contains(false))
            {
                Console.WriteLine("Incorrect entered something.");
            }
            else
            {
                if (x != 0 && y != 0)
                {
                    if (x > 0)
                    {
                        if (y > 0)
                        {
                            quadrant = 1;
                        }
                        else
                        {
                            quadrant = 4;
                        }
                    }
                    else
                    {
                        if (y > 0)
                        {
                            quadrant = 2;
                        }
                        else
                        {
                            quadrant = 3;
                        }
                    }
                    Console.WriteLine("Point in the quadrant - {0}", quadrant);
                }
                else
                {
                    Console.WriteLine("One of the coordinates is equal to zero!");
                }
            }
           
        }
           
        public void Task5(int heigth, int length, char ch)
        {
            //5) Нарисовать рамку в консоли. 
            //    Высота, Ширина и символ для отображения границ рамки являются входящими параметрами в метод

                char[,] array = new char[heigth, length];
                for (int i = 0; i < array.GetLength(0); i++)
                {
                    for (int j = 0; j < array.GetLength(1); j++)
                    {
                        if ((i == 0 || i == heigth - 1) || j == 0 || j == length - 1)
                        {
                            array[i, j] = ch;
                        }
                        else
                        {
                            array[i, j] = ' ';
                        }

                    }
                }
                for (int i = 0; i < array.GetLength(0); i++)
                {
                    for (int j = 0; j < array.GetLength(1); j++)
                    {
                        Console.Write(array[i, j]);
                    }
                    Console.WriteLine();
                }
        } 

        public int[] RandomCreate (int size)
        {
            //6) Реализовать метод который создает и возвращает одномерный массив целочисленных значений и заполняет его случайными числами в диапазоне от 1 до 1000.
            //    Размер массива указывается во входящем параметре метода.

                int[] array = new int[size];
                Random rnd = new Random();
                for (int i = 0; i < size; i++)
                {
                    array[i] = rnd.Next(1, 1001);
                }
                return array;
            
        }

        public void Task7()
        {
            //7) Вывести элементы массива на экран. Посчитать количество четных и нечетных элементов. 
            //    Для создания массива воспользоваться методом из предыдущего задания

            Console.WriteLine("Enter the size of array:");
            int size;
            bool choice = Int32.TryParse(Console.ReadLine(), out size);
            if (choice)
            {
                int[] array = RandomCreate(size);
                for (int i = 0; i < array.Length; i++)
                {
                    Console.Write(array[i]);
                    Console.Write(";");
                }
                Console.WriteLine();
                int even = 0;
                int odd = 0;
                for (int i = 0; i < size; i++)
                {
                    if (array[i]%2 == 0)
                    {
                        even++;
                    }
                    else
                    {
                        odd++;
                    }
                }
                Console.WriteLine("Count of even numbers - {0}, count of odd numbers - {1}", even, odd);
            }
            else
            {
                Console.WriteLine("Incorrect entered size of array.");
            }

        }

        public int[] RandomArray(int size)
        {
            int[] array = new int[size];
            Random rnd = new Random();
            for (int i = 0; i < size; i++)
            {
                array[i] = rnd.Next(1, 1001);
            }
            return array;
        }

        public void Task8()
        {
            //8) Вывести массив на экран, найти позицию первого вхождения минимального и максимального элемента, 
            //а так же общее кол - во вхождени й минимального и максимального элементов в массив

            Console.WriteLine("Enter the size of array:");
            int size;
            bool choice = Int32.TryParse(Console.ReadLine(), out size);
            int max = 0;
            int maxCount = 0;
            int min = Int32.MaxValue;
            int minCount = 0;
            
            if (choice)
            {
                int[] array = RandomCreate(size);
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i] > max)
                    {
                        max = array[i];
                    }
                    if (array[i] < min)
                    {
                        min = array[i];
                    }
                    
                    Console.Write(array[i]);
                    Console.Write(";");
                }
                // or use next features...
                //int max2 = array.Max();
                //int min2 = array.Min();


                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i] == max)
                    {
                        maxCount++;
                    }
                    if (array[i] == min)
                    {
                        minCount++;
                    }
                }
                
                Console.WriteLine();
                Console.WriteLine("max - {0}, min  - {1}", max, min);
                int firstIndxOfMax = Array.IndexOf(array, max);
                int firstIndxOfMin = Array.IndexOf(array, min);
                Console.WriteLine("First appearence of the min value is - {0}, max value is - {1}", firstIndxOfMin+1, firstIndxOfMax+1);
                Console.WriteLine("Max value appeared {0} times, min value appeared {1} times", maxCount,minCount);
            }
            else
            {
                Console.WriteLine("Incorrect entered size of array.");
            }
        }
    }
}
